home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 2 / CD ACTUAL VOL 2.iso / programa / tunplus / tun / tunemul.ms_ / tunemul.ms
Encoding:
Text File  |  1995-09-15  |  28.6 KB  |  1,065 lines

  1. '**************************************************************************
  2. '*                   Tun EMUL Setup installation script
  3. '**************************************************************************
  4.  
  5. '$DEFINE DEBUG  ''Define for script development/debugging
  6.  
  7. '$INCLUDE 'setupapi.inc'
  8. '$INCLUDE 'msdetect.inc'
  9.  
  10.  
  11. GLOBAL ASKCUSTOM$
  12. GLOBAL FINDINSTTYPE$
  13. GLOBAL ENCRYPTDLG$ 
  14. GLOBAL COPYFILES$ 
  15. GLOBAL ENCRYPTFILES$ 
  16. GLOBAL CREATEINIFILES$ 
  17. GLOBAL ADDPATH$
  18. GLOBAL ASKTCPCONF$
  19. GLOBAL RUNTCPCONF$
  20. GLOBAL CREATEGROUPS$ 
  21. GLOBAL szSN$
  22. GLOBAL szAK$
  23. GLOBAL szLS$
  24. GLOBAL DEST$        ''Default destination directory.
  25.  
  26. '$INCLUDE 'setup.inc'
  27.  
  28. ''Dialog ID's
  29. CONST ASKQUIT      = 200
  30. CONST DESTPATH     = 300
  31. CONST EXITFAILURE  = 400
  32. CONST EXITQUIT     = 600
  33. CONST EXITSUCCESS  = 700
  34. CONST OPTIONS      = 800
  35. CONST APPHELP      = 900
  36. CONST DIREXIST     = 1000
  37. CONST CUSTINST     = 6200
  38. CONST TOOBIG       = 6300
  39. CONST BADPATH      = 6400
  40. CONST CDGETNAMEORG = 7500
  41. CONST CDBADORG     = 7800
  42. CONST MODELESS     = 5000
  43. CONST MODELESS2    = 5001
  44. CONST ASKUPDATE    = 5003
  45. CONST ASKYESNOBACK = 5004
  46. CONST ASKYESNO     = 5005
  47. CONST CDBADFILE    = 7200
  48. CONST GETSERIALNUM = 1100
  49. CONST WINPATH      = 1300
  50.  
  51. ''Bitmap ID
  52. CONST LOGO         = 1
  53.  
  54. ''File Types
  55. CONST APPFILES     = 1
  56. CONST OPTFILES1    = 2
  57. CONST OPTFILES2    = 3
  58. CONST CRYPTFILES   = 100
  59. CONST CTL3DFILES   = 101
  60. CONST CONVERTFILES = 102
  61.  
  62. ''Standard dialog button IDs 
  63. CONST IDOK         = 1
  64. CONST IDCANCEL     = 2
  65. CONST IDABORT      = 3
  66. CONST IDRETRY      = 4
  67. CONST IDIGNORE     = 5
  68. CONST IDYES        = 6
  69. CONST IDNO         = 7
  70.  
  71. GLOBAL DESTKER$   ''Default destination sub-directory.
  72. GLOBAL DESTEMUL$   ''Default destination sub-directory.
  73. GLOBAL DESTCOM$   ''Default destination sub-directory.
  74. GLOBAL SETUPPROG$   ''Full Path of DLL to be load.
  75. GLOBAL FILEPATH$    ''Temp File Path.
  76. GLOBAL WINDRIVE$    ''Windows drive letter.
  77. GLOBAL OPT1OPT$     ''Option selection from OptFiles1 option dialog.
  78. GLOBAL OPT2OPT$     ''Option selection from OptFiles1 option dialog.
  79.  
  80. ''CustInst list symbol names
  81. GLOBAL APPNEEDS$    ''Option list costs per drive
  82. GLOBAL OPT1NEEDS$
  83. GLOBAL OPT2NEEDS$
  84. GLOBAL EXTRACOSTS$  ''List of extra costs to add per drive
  85. GLOBAL BIGLIST$     ''List of option files cost calc results (boolean)
  86.  
  87. ''Dialog list symbol names
  88. GLOBAL CHECKSTATES$
  89. GLOBAL STATUSTEXT$
  90. GLOBAL DRIVETEXT$
  91. ''
  92.  
  93. GLOBAL DiskFileVersion$ 
  94. GLOBAL MasterFileVersion$ 
  95. GLOBAL TCPCONF$ 
  96. GLOBAL INSTALLEDKER%
  97. GLOBAL INSTALLKER%
  98. GLOBAL INSTALLEDEMUL%
  99. GLOBAL INSTALLEMUL%
  100. GLOBAL INSTALLCRYPT%
  101. GLOBAL INSTALLCTL3D%
  102. GLOBAL INSTALLCONVERT%
  103. GLOBAL FINDTUNPATH%
  104.  
  105.  
  106. DECLARE SUB RegisterCtl3d LIB "tunemul.dll"
  107. DECLARE SUB UnregisterCtl3d LIB "tunemul.dll"
  108. DECLARE SUB ShowMaximize LIB "tuncomm.dll" (frame%)
  109. DECLARE SUB SetCharSet LIB "tuncomm.dll" (szDir$,szFile$)
  110. DECLARE FUNCTION CustomSetup LIB "tuncomm.dll" (frame%,szDir$)
  111. DECLARE FUNCTION AddTunDir LIB "tuncomm.dll" (szDir$) AS INTEGER
  112. DECLARE FUNCTION FindExistingPath LIB "tuncomm.dll" (szDir$) AS INTEGER
  113. DECLARE FUNCTION EncryptFile LIB "tuncomm.dll" (szPath$, szSer$, szKey$, szLi$) AS INTEGER
  114. DECLARE FUNCTION AddLangMenu LIB "tuncomm.dll" (szPath$) AS INTEGER
  115. DECLARE FUNCTION CreatIniConvert LIB "tuncomm.dll" (szPath$) AS INTEGER
  116. DECLARE FUNCTION CreatIniKer LIB "tuncomm.dll" (Path$,InstTcp%) AS INTEGER
  117. DECLARE FUNCTION CreatIniEmul LIB "tuncomm.dll" (Path$,nLG%) AS INTEGER
  118. DECLARE FUNCTION MyExitWindows LIB "tuncomm.dll" (nType%) AS INTEGER
  119.      
  120. DECLARE FUNCTION IsInstalled (szSection$,szKey$,szFile$,szPath$) AS INTEGER
  121. DECLARE SUB AddOptFilesToCopyList (ftype%)
  122. DECLARE SUB RecalcOptFiles (ftype%)
  123. DECLARE SUB RecalcPath
  124. DECLARE SUB SetDriveStatus
  125. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  126. DECLARE FUNCTION MakeString (i%) AS STRING
  127. DECLARE FUNCTION IsNewer (szVersion1$, szVersion2$) AS INTEGER
  128.  
  129.  
  130.  
  131. INIT:
  132.     CUIDLL$ = "tunemul.dll"            ''custom user interface dll
  133.     HELPPROC$ = "FHelpDlgProc"          ''Help dialog procedure
  134.  
  135. ''
  136. ''      Setup control screen:
  137. ''        Maximize Window, Add bitmap to CUIDLL, Set Window Title 
  138. ''
  139.     WndFrame% = HwndFrame()
  140.     ShowMaximize WndFrame%
  141.     SetBitmap CUIDLL$, LOGO
  142.     SetTitle "Tun EMUL - Setup"
  143.  
  144. ''
  145. ''      Read INF file
  146. ''
  147.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  148.     IF szInf$ = "" THEN
  149.     szInf$ = GetSymbolValue("STF_CWDDIR") + "tunemul.INF"
  150.     END IF
  151.     ReadInfFile szInf$
  152.  
  153. ''
  154. ''  Init Variables
  155. ''
  156.     WINDRIVE$ = MID$(GetWindowsDir, 1, 1)
  157.     IF DEST$ = "" THEN
  158.       DEST$ = WINDRIVE$ + ":\TUN"
  159.     ENDIF
  160.  
  161.     ''CustInst list symbols
  162.     CHECKSTATES$ = "CheckItemsState"
  163.     STATUSTEXT$  = "StatusItemsText"
  164.     DRIVETEXT$   = "DriveStatusText"
  165.     FOR i% = 1 TO 4 STEP 1
  166.     AddListItem CHECKSTATES$, "OFF"
  167.     NEXT i%
  168.     FOR i% = 1 TO 4 STEP 1
  169.     AddListItem STATUSTEXT$, ""
  170.     NEXT i%
  171.     FOR i% = 1 TO 7 STEP 1
  172.     AddListItem DRIVETEXT$, ""
  173.     NEXT i%
  174.     ReplaceListItem DRIVETEXT$, 7, DEST$
  175.  
  176.     ''Disk cost list symbols
  177.     APPNEEDS$   = "AppNeeds"
  178.     OPT1NEEDS$  = "Opt1Needs"
  179.     OPT2NEEDS$  = "Opt2Needs"
  180.     EXTRACOSTS$ = "ExtraCosts"
  181.     BIGLIST$    = "BigList"
  182.     FOR i% = 1 TO 5 STEP 1
  183.     AddListItem BIGLIST$, ""
  184.     NEXT i%
  185.     FOR i% = 1 TO 26 STEP 1
  186.     AddListItem EXTRACOSTS$, "0"
  187.     AddListItem OPT1NEEDS$, "0"
  188.     AddListItem OPT2NEEDS$, "0"
  189.     NEXT i%
  190.  
  191.     ''File Option Variables
  192.     OPT1OPT$ = "1"
  193.     OPT2OPT$ = "1"
  194.  
  195.     INSTALLEDKER% = 0 
  196.     
  197.     RecalcPath
  198.     SetDriveStatus
  199.     
  200.  
  201. '$IFDEF DEBUG
  202.     i% = SetSizeCheckMode(scmOnIgnore)    '' could use scmOff; def = scmOnFatal
  203. '$ENDIF ''DEBUG
  204.  
  205.     RegisterCtl3d
  206.  
  207. IF ASKCUSTOM$ <> "NO" THEN
  208. CUSTINST:
  209.     sz$ = UIStartDlg(CUIDLL$, CUSTINST, "FCustInstDlgProc", APPHELP, HELPPROC$)
  210.  
  211.     IF sz$ = "CONTINUE" THEN
  212.     ''Install only if it will fit.
  213.     FOR i% = 1 TO 5 STEP 1
  214.         IF GetListItem(BIGLIST$, i%) <> "" THEN
  215.         GOSUB TOOBIG
  216.         GOTO CUSTINST
  217.         END IF
  218.     NEXT i%
  219.     UIPop 1
  220.     GOTO INSTALL
  221.     ELSEIF sz$ = "PATH" THEN
  222.     GOTO GETPATH
  223.     ELSEIF sz$ = "CHK2" THEN
  224.     RecalcOptFiles OPTFILES1
  225.     IF INSTALLEDKER% <> 1 THEN
  226.       RecalcOptFiles OPTFILES2
  227.     ENDIF
  228.     SetDriveStatus
  229.     GOTO CUSTINST
  230.     ELSEIF sz$ = "REACTIVATE" THEN
  231.     RecalcPath
  232.     SetDriveStatus
  233.     GOTO CUSTINST
  234.     ELSE
  235.     GOSUB ASKQUIT
  236.     GOTO CUSTINST
  237.     END IF
  238. ENDIF
  239.  
  240. INSTALL:
  241.  
  242. ''
  243. ''      Init path sub-directory
  244. ''
  245.  
  246.     DESTKER$= MakePath( DEST$, "KERNELW")
  247.     DESTEMUL$= MakePath( DEST$, "EMUL")
  248.     DESTCOM$= MakePath( DEST$, "COMMON")
  249.  
  250. ''
  251. ''      Find type of installation
  252. ''
  253. IF GetListItem(CHECKSTATES$, OPTFILES1) = "ON" THEN
  254.   INSTALLKER% = 1
  255.   IF FINDINSTTYPE$ <> "NO" THEN
  256.  
  257.     FILEPATH$= MakePath( DESTKER$, "TUNTCPIP.DLL")
  258.     IF DoesFileExist ( FILEPATH$, femExits) = 1 THEN
  259.       MasterFileVersion$ = GetSectionKeyVersion("KernelFiles","TUNTCPIP.DLL")
  260.       DiskFileVersion$ = GetVersionOfFile( FILEPATH$)
  261.       INSTALLEDKER% = IsNewer( DiskFileVersion$, MasterFileVersion$) 
  262.     ENDIF
  263.  
  264.     IF INSTALLEDKER% = 1 THEN
  265.       SetSymbolValue "TitleYesNoBack", "Update"
  266.       SetSymbolValue "MessageYesNoBack", "The same version of Tun KERNEL has been found. Do you want to overwrite it ?" 
  267. INSK1:
  268.       sz$ = UIStartDlg(CUIDLL$, ASKYESNOBACK, "FAskYesNoBackDlgProc", 0, "")
  269.       UIPop 1
  270.       IF sz$ = "YES" THEN
  271.     INSTALLKER% = 1 
  272.       ELSEIF sz$ = "BACK" THEN
  273.     GOTO CUSTINST 
  274.       ELSEIF sz$ = "REACTIVATE" THEN
  275.         GOTO INSK1
  276.       ELSE
  277.     INSTALLKER% = 0
  278.       ENDIF
  279.     ELSEIF INSTALLEDKER% = 2 THEN
  280.       SetSymbolValue "TitleYesNoBack", "Update"
  281.       SetSymbolValue "MessageYesNoBack", "A previous version of Tun KERNEL has been found. Do you want to overwrite it ?" 
  282. INSK2:
  283.       sz$ = UIStartDlg(CUIDLL$, ASKYESNOBACK, "FAskYesNoBackDlgProc", 0, "")
  284.       UIPop 1
  285.       IF sz$ = "YES" THEN
  286.     INSTALLKER% = 2 
  287.       ELSEIF sz$ = "BACK" THEN
  288.     GOTO CUSTINST 
  289.       ELSEIF sz$ = "REACTIVATE" THEN
  290.         GOTO INSK2
  291.       ELSE
  292.     INSTALLKER% = 0
  293.       ENDIF
  294.     ELSE
  295.       INSTALLKER% = 1
  296.     ENDIF
  297.   ENDIF
  298. ELSE
  299.   INSTALLKER% = 0
  300. ENDIF
  301.  
  302. INSTALLEDEMUL% = 0
  303. INSTALLEMUL% = 1
  304. INSTALLCRYPT% = 1
  305. INSTALLCTL3D% = 1
  306. INSTALLCONVERT% = 1
  307. IF FINDINSTTYPE$ <> "NO" THEN
  308.  
  309. FILEPATH$= MakePath( DESTEMUL$, "EMULWIN.EXE")
  310.   IF DoesFileExist ( FILEPATH$, femExits) = 1 THEN
  311.     MasterFileVersion$ = GetSectionKeyVersion("EmulFiles","EMULWIN.EXE")
  312.     DiskFileVersion$ = GetVersionOfFile( FILEPATH$)
  313.     INSTALLEDEMUL% = IsNewer( DiskFileVersion$, MasterFileVersion$) 
  314.   ENDIF
  315.  
  316.   IF INSTALLEDEMUL% = 1 THEN
  317.     SetSymbolValue "TitleYesNoBack", "Update"
  318.     SetSymbolValue "MessageYesNoBack", "The same version of Tun EMUL has been found. Do you want to overwrite it ?" 
  319. INSE1:
  320.     sz$ = UIStartDlg(CUIDLL$, ASKYESNOBACK, "FAskYesNoBackDlgProc", 0, "")
  321.     UIPop 1
  322.     IF sz$ = "YES" THEN
  323.       INSTALLEMUL% = 1 
  324.     ELSEIF sz$ = "BACK" THEN
  325.       GOTO CUSTINST 
  326.     ELSEIF sz$ = "REACTIVATE" THEN
  327.         GOTO INSE1
  328.     ELSE
  329.       INSTALLEMUL% = 0
  330.     ENDIF
  331.   ELSEIF INSTALLEDEMUL% = 2 THEN
  332.     SetSymbolValue "TitleYesNoBack", "Update"
  333.     SetSymbolValue "MessageYesNoBack", "A previous version of Tun EMUL has been found. Do you want to overwrite it ?" 
  334. INSE2:
  335.     sz$ = UIStartDlg(CUIDLL$, ASKYESNOBACK, "FAskYesNoBackDlgProc", 0, "")
  336.     UIPop 1
  337.     IF sz$ = "YES" THEN
  338.       INSTALLEMUL% = 2 
  339.     ELSEIF sz$ = "BACK" THEN
  340.       GOTO CUSTINST 
  341.     ELSEIF sz$ = "REACTIVATE" THEN
  342.         GOTO INSE2
  343.     ELSE
  344.       INSTALLEMUL% = 0
  345.     ENDIF
  346.   ELSE
  347.     INSTALLEMUL% = 1
  348.   ENDIF
  349.  
  350. '' Tuncrypt ?
  351.   fInst% = IsInstalled ("CryptFiles","TUNCRYPT.DLL","TUNCRYPT.DLL",DESTCOM$)
  352.   IF fInst% <> 2 AND fInst% <> 4 THEN 
  353.      INSTALLCRYPT%=0
  354.   ENDIF
  355.  
  356. '' Convert ?
  357.   fInst% = IsInstalled ("ConvertFiles","CONVERT.DLL","CONVERT.DLL",DESTCOM$)
  358.   IF fInst% <> 2 AND fInst% <> 4 THEN 
  359.      INSTALLCONVERT%=0
  360.   ENDIF
  361.  
  362. '' CTL3D ?
  363.   fInst% = IsInstalled ("Ctl3dFiles","CTL3D.TUN","CTL3D.DLL",GetWindowsSysDir)
  364.   IF fInst% = 0 OR fInst% = 1 THEN 
  365.      INSTALLCTL3D%=0
  366.   ELSEIF fInst% = 2 THEN
  367.      INSTALLCTL3D%=2
  368.   ENDIF
  369.  
  370. ENDIF
  371. IF INSTALLEMUL% = 0 AND INSTALLKER%= 0 THEN
  372.   GOTO CUSTINST
  373. ENDIF
  374.  
  375. ''
  376. ''      Serialization Dialogue Box
  377. ''
  378. IF ENCRYPTDLG$ <> "NO" THEN
  379. SERIAL:
  380.     sz$ = UIStartDlg(CUIDLL$, GETSERIALNUM, "FNameOrgDlgProc", APPHELP, HELPPROC$)
  381.     IF sz$ = "CANCEL" THEN
  382.       sz$ = UIStartDlg(CUIDLL$, CDBADORG, "FInfoDlgProc", 0, "" )
  383.       UIPop 1
  384.       GOTO SERIAL
  385.     ELSEIF sz$ = "EXIT" THEN
  386.       GOSUB ASKQUIT
  387.       GOTO SERIAL
  388.     ELSEIF sz$ <> "CONTINUE" THEN
  389.       GOTO SERIAL
  390.     ENDIF
  391.        
  392.     szSN$ = GetSymbolValue( "NameOut" )
  393.     szAK$ = GetSymbolValue( "OrgOut" )
  394.     szLS$ = GetSymBolValue( "LicenseStringOut" )
  395.     szHEAD$ = MID$( szSN$, 4, 2 )
  396.     IF szHEAD$ <> "02" AND szHEAD$ <> "01" THEN
  397. BADF1:
  398.       sz$ = UIStartDlg(CUIDLL$, CDBADFILE, "FInfoDlgProc", 0, "" )
  399.       UIPop 1
  400.       IF sz$ = "EXIT" THEN
  401.           GOTO ASKQUIT
  402.           GOTO SERIAL
  403.           ELSEIF sz$ = "CONTINUE" THEN
  404.           GOTO SERIAL
  405.           ELSE
  406.               GOTO BADF1
  407.       ENDIF
  408.     ENDIF
  409.     UIPop 1
  410. ENDIF
  411.  
  412.  
  413. ''
  414. ''      Copy procedure
  415. ''
  416. IF COPYFILES$ <> "NO" THEN
  417.     ClearCopyList
  418.     AddOptFilesToCopyList APPFILES
  419.     IF INSTALLKER% <> 0 THEN
  420.       AddOptFilesToCopyList OPTFILES1
  421.       IF INSTALLKER% = 1 THEN
  422.     AddOptFilesToCopyList OPTFILES2
  423.       ENDIF
  424.     ENDIF
  425.     IF INSTALLCRYPT% = 1 THEN
  426.       AddOptFilesToCopyList CRYPTFILES
  427.     ENDIF
  428.     IF INSTALLCONVERT% = 1 THEN
  429.       AddOptFilesToCopyList CONVERTFILES
  430.     ENDIF
  431.     IF INSTALLCTL3D% <> 0 THEN
  432.       AddOptFilesToCopyList CTL3DFILES
  433.     ENDIF
  434.     CreateDir DEST$, cmoNone
  435.     SetRestartDir MakePath( DEST$, "TMP")
  436.     CopyFilesInCopyList
  437.  
  438. ENDIF
  439.  
  440. ''
  441. ''      Encrypt procedure
  442. ''
  443. IF ENCRYPTFILES$ <> "NO" THEN
  444.  
  445. ''    SetSymbolValue "NameOut", szSN$
  446. ''    SetSymbolValue "OrgOut", szAK$
  447. ''    SetSymBolValue "LicenseStringOut", szLS$
  448. ''IF INSTALLKER% <> 0 THEN
  449. ''    SetSymbolValue "PathFiles", DESTKER$
  450. ''    SetSymbolValue "ProgramType", "KER" 
  451. ''    sz$ = UIStartDlg(CUIDLL$, MODELESS, "FModelessDlgProc", 0, "" )
  452. ''    UIPop 1
  453. ''ENDIF
  454. ''    SetSymbolValue "PathFiles", DESTEMUL$
  455. ''    SetSymbolValue "ProgramType", "EMUL" 
  456. ''    sz$ = UIStartDlg(CUIDLL$, MODELESS, "FModelessDlgProc", 0, "" )
  457. ''    UIPop 1
  458.  
  459.     fEncryt%=EncryptFile(DESTCOM$, szSN$, szAK$, szLS$)
  460.  
  461. ENDIF
  462.  
  463. ''
  464. ''       Installation of CTL3D.DLL if required
  465. ''
  466. CTL3D:
  467.    szNF$ = MakePath(DESTCOM$ , "CTL3D.TUN")
  468.    szOF$ = GetWindowsSysDir() + "CTL3D.DLL"
  469.    IF INSTALLCTL3D% = 2 THEN 
  470. CTL3D1:
  471.      sz$ = UIStartDlg(CUIDLL$, ASKUPDATE, "FAskUpdateDlgProc", 0, "")
  472.      IF sz$ = "YES" THEN
  473.        CopyFile szOF$, GetWindowsSysDir() + "CTL3D.OLD", cmoOverwrite, 0
  474.        CopyFile szNF$, szOF$, cmoOverwrite, 0 
  475.      ELSEIF sz$ = "REACTIVATE" THEN
  476.         GOTO CTL3D1
  477.      ENDIF
  478.      UIPop 1
  479.    ELSEIF INSTALLCTL3D% = 1 THEN
  480.        CopyFile szNF$, szOF$, cmoOverwrite, 0 
  481.    ENDIF
  482.  
  483. ''
  484. ''      Modification/Creation of Tun EMUL / Tun KERNEL entry in TUN.INI
  485. ''
  486. IF CREATEINIFILES$ <> "NO" THEN
  487.  
  488.     CursorSave% = ShowWaitCursor()
  489.  
  490.     szLG$ = MID$( szSN$, 3, 1 )
  491.     nLG% = (ASC(MID$(szSN$,6,1)) - ASC("0")) * 10 + (ASC(MID$(szSN$,7,1)) - ASC("0"))
  492.     IF DoesIniKeyExist( MakePath( GetWindowsDir(), "TUN.INI"), "Language", "Language") = 0 THEN
  493.     IF nLG% = 1 THEN
  494.         szLGN$= "01"
  495.     ELSEIF nLG% > 3 THEN
  496.         szLGN$ = MakeString(nLG% - 2 ) 
  497.     ELSE
  498.         szLGN$ ="00"
  499.     END IF
  500.         CreateIniKeyValue MakePath( GetWindowsDir(), "TUN.INI"), "Language", "Language", szLGN$ ,cmoOverwrite
  501.     END IF
  502.  
  503. IF INSTALLCRYPT% = 1 THEN
  504.   i%=AddLangMenu(DESTCOM$)
  505. ENDIF
  506.  
  507. IF INSTALLCONVERT% = 1 THEN
  508.   i%=CreatIniConvert(DESTCOM$)
  509. ENDIF
  510.  
  511. IF INSTALLKER% <> 0 THEN
  512.  i%= CreatIniKer(DESTKER$,0)
  513. ENDIF
  514.  
  515. i%= CreatIniEmul(DESTEMUL$,nLG%)
  516.  
  517.     RestoreCursor CursorSave%
  518. ENDIF
  519.  
  520. ''
  521. ''      Add Path of Tun KERNEL in AUTOEXEC.BAT
  522. ''
  523. FINDTUNPATH%=1
  524. IF ADDPATH$ <> "NO" THEN
  525.  
  526. IF INSTALLKER% <> 0 THEN
  527.   FINDTUNPATH% = FindExistingPath(DESTKER$)
  528.   IF FINDTUNPATH% = 0 THEN
  529.     i% = AddTunDir(DESTKER$)
  530.   ENDIF
  531. ENDIF
  532. ENDIF
  533.  
  534. ''
  535. ''     Ask to configure TCP/IP 
  536. ''
  537. TCPCONF$ = "NO"
  538.  
  539. IF ASKTCPCONF$ <> "NO" THEN
  540.  
  541. IF INSTALLKER% <> 0 THEN
  542.     SetSymbolValue "MessageYesNo", "Do you want to configure TCP/IP now ? This can be done later running the Administrator"
  543.     SetSymbolValue "TitleYesNo", "TCP/IP Configuration"
  544. TCPCONF1:
  545.     TCPCONF$ = UIStartDlg(CUIDLL$, ASKYESNO, "FAskYesNoDlgProc", 0, "" )
  546.     IF TCPCONF$ = "REACTIVATE" THEN
  547.         GOTO TCPCONF1
  548.     ENDIF
  549.     UIPop 1
  550. ENDIF
  551.  
  552. ENDIF
  553.  
  554. ''
  555. ''      TUN KERNEL ProgramGroup and ProgramItem creation  
  556. ''
  557.  
  558. IF CREATEGROUPS$ <> "NO" THEN
  559.  
  560. IF INSTALLKER% <> 0 THEN
  561.     CreateProgmanGroup "Tun KERNEL", "", cmoNone
  562.     ShowProgmanGroup  "Tun KERNEL", 1, cmoNone
  563.     CreateProgmanItem "Tun KERNEL", "Admin", MakePath( DESTKER$, "WTUNTCPW.EXE -NFS -NFSD -LPR -LPD -FTPD" ), "", cmoOverwrite
  564.     CreateProgmanItem "Tun KERNEL", "WTCPIP", MakePath( DESTKER$, "WTCPIP.EXE" ), "", cmoOverwrite
  565.     CreateProgmanItem "Tun KERNEL", "Ping", MakePath( DESTKER$, "WPING.EXE" ), "", cmoOverwrite
  566.  
  567. ENDIF
  568.  
  569.     CreateProgmanGroup "Tun EMUL", "", cmoNone
  570.     ShowProgmanGroup  "Tun EMUL", 1, cmoNone
  571.     CreateProgmanItem "Tun EMUL", "Terminal Emulator", MakePath( DESTEMUL$, "EMULWIN.EXE" ), "", cmoOverwrite
  572.     CreateProgmanItem "Tun EMUL", "5250 Emulator", MakePath( DESTEMUL$, "5250.EXE" ), "", cmoOverwrite
  573.     CreateProgmanItem "Tun EMUL", "3270 Emulator", MakePath( DESTEMUL$, "3270.EXE" ), "", cmoOverwrite
  574.     CreateProgmanItem "Tun EMUL", "Panel Editor", MakePath( DESTEMUL$, "PANEDIT.EXE" ), "", cmoOverwrite
  575.  
  576. ENDIF
  577.  
  578. ''
  579. ''      Run TCP/IP Custom Dialogs
  580. ''
  581. IF RUNTCPCONF$ <> "NO" THEN
  582.  
  583. IF INSTALLKER% <> 0 THEN
  584.   IF TCPCONF$= "YES" THEN
  585.     SETUPPROG$= MakePath( DESTKER$, "WTCPDLG.DLL")
  586.     i% = CustomSetup( WndFrame%, SETUPPROG$)
  587.   ENDIF
  588. ENDIF
  589. ENDIF
  590.  
  591. QUIT:
  592.     ON ERROR GOTO ERRQUIT
  593.  
  594.     IF ERR = 0 THEN
  595.     dlg% = EXITSUCCESS
  596.     IF COPYFILES$ <> "NO" THEN
  597.       IF RestartListEmpty() = 0 THEN
  598.         dumb% = ExitExecRestart()
  599.       END IF
  600.     ENDIF
  601.         IF FINDTUNPATH% = 0 THEN
  602. REBOOT1:
  603.           SetSymbolValue "TitleYesNo", "Restart System"
  604.           SetSymbolValue "MessageYesNo", "Setup has modified AUTOEXEC.BAT file. Do you want to restart the computer ?" 
  605.           sz$ = UIStartDlg(CUIDLL$, ASKYESNO, "FAskYesNoDlgProc", 0, "")
  606.           UIPop 1
  607.           IF sz$ <> "NO" THEN
  608.          i%=MyExitWindows(1)
  609.              GOTO REBOOT1
  610.           ENDIF
  611.         ELSE
  612. REBOOT2:
  613.           SetSymbolValue "TitleYesNo", "Restart Windows"
  614.           SetSymbolValue "MessageYesNo", "Setup has modified Windows system files. Do you want to restart Windows ?" 
  615.           sz$ = UIStartDlg(CUIDLL$, ASKYESNO, "FAskYesNoDlgProc", 0, "")
  616.           UIPop 1
  617.           IF sz$ <> "NO" THEN
  618.          i%=MyExitWindows(0)
  619.              GOTO REBOOT2
  620.           ENDIF
  621.         ENDIF
  622.     ELSEIF ERR = STFQUIT THEN
  623.     dlg% = EXITQUIT
  624.     ELSE
  625.     dlg% = EXITFAILURE
  626.     END IF
  627. QUITL1:
  628.     sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfo0DlgProc", 0, "")
  629.     IF sz$ = "REACTIVATE" THEN
  630.     GOTO QUITL1
  631.     END IF
  632.     UnregisterCtl3d
  633.     UIPop 1
  634.  
  635.     END
  636.  
  637. ERRQUIT:
  638.     i% = DoMsgBox("Les sources de Setup ne sont plus valide, appelez le support technique!", "Message Setup", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  639.     END
  640.  
  641.  
  642.  
  643. GETPATH:
  644.     SetSymbolValue "EditTextIn", DEST$
  645.     SetSymbolValue "EditFocus", "END"
  646. GETPATHL1:
  647.     sz$ = UIStartDlg(CUIDLL$, DESTPATH, "FEditDlgProc", APPHELP, HELPPROC$)
  648.  
  649.     IF sz$ = "CONTINUE" THEN
  650.     olddest$ = DEST$
  651.     DEST$ = GetSymbolValue("EditTextOut")
  652.  
  653.     ''Validate new path.
  654.     IF IsDirWritable(DEST$) = 0 THEN
  655.         GOSUB BADPATH
  656.         GOTO GETPATHL1
  657.     END IF
  658.     UIPop 1
  659.  
  660.     ''Truncate display if too long.
  661.     IF LEN(DEST$) > 23 THEN
  662.         ReplaceListItem DRIVETEXT$, 7, MID$(DEST$, 1, 23)+"..."
  663.     ELSE
  664.         ReplaceListItem DRIVETEXT$, 7, DEST$
  665.     END IF
  666.  
  667.     ''Recalc if path changed.
  668.     IF (olddest$ <> DEST$) AND (olddest$ <> DEST$+"\") AND (olddest$+"\" <> DEST$) THEN
  669.         RecalcPath
  670.         SetDriveStatus
  671.     END IF
  672.  
  673.     olddest$ = ""
  674.     GOTO CUSTINST
  675.     ELSEIF sz$ = "REACTIVATE" THEN
  676.     RecalcPath
  677.     SetDriveStatus
  678.     GOTO GETPATHL1
  679.     ELSEIF sz$ = "EXIT" THEN
  680.     GOSUB ASKQUIT
  681.     GOTO GETPATHL1
  682.     ELSE
  683.     UIPop 1
  684.     GOTO CUSTINST
  685.     END IF
  686.  
  687.  
  688. GETPATHWIN:
  689.     SetSymbolValue "EditTextIn", WINSOCKPATH$
  690.     SetSymbolValue "EditFocus", "END"
  691. GETPATHL1WIN:
  692.     sz$ = UIStartDlg(CUIDLL$, WINPATH, "FEditDlgProc", APPHELP, HELPPROC$)
  693.  
  694.     IF sz$ = "CONTINUE" THEN
  695.     oldwinsockpath$ = WINSOCKPATH$
  696.     WINSOCKPATH$ = GetSymbolValue("EditTextOut")
  697.  
  698.     ''Validate new path.
  699.     IF IsDirWritable(WINSOCKPATH$) = 0 THEN
  700.         GOSUB BADPATH
  701.         GOTO GETPATHL1WIN
  702.     END IF
  703.     UIPop 1
  704.  
  705.     ''Truncate display if too long.
  706.     IF LEN(WINSOCKPATH$) > 23 THEN
  707.         ReplaceListItem DRIVETEXT$, 4, MID$(WINSOCKPATH$, 1, 23)+"..."
  708.     ELSE
  709.         ReplaceListItem DRIVETEXT$, 4, WINSOCKPATH$
  710.     END IF
  711.  
  712.     oldwinsockpath$ = ""
  713.     GOTO CUSTINST
  714.     ELSEIF sz$ = "REACTIVATE" THEN
  715.     GOTO GETPATHL1WIN
  716.     ELSEIF sz$ = "EXIT" THEN
  717.     GOSUB ASKQUIT
  718.     GOTO GETPATHL1WIN
  719.     ELSE
  720.     UIPop 1
  721.     GOTO CUSTINST
  722.     END IF
  723.  
  724. ''OPTFILES1:
  725. ''    SetSymbolValue "RadioDefault", OPT1OPT$
  726. ''OPT1L1:
  727. ''    sz$ = UIStartDlg(CUIDLL$, OPTIONS, "FRadioDlgProc", APPHELP, HELPPROC$)
  728. ''    newopt$ = GetSymbolValue("ButtonChecked")
  729. ''
  730. ''    IF sz$ = "CONTINUE" THEN
  731. ''        UIPop 1
  732. ''        IF newopt$ <> OPT1OPT$ THEN
  733. ''            OPT1OPT$ = newopt$
  734. ''            RecalcOptFiles OPTFILES1
  735. ''            SetDriveStatus
  736. ''        END IF
  737. ''        newopt$ = ""
  738. ''        GOTO CUSTINST
  739. ''    ELSEIF sz$ = "REACTIVATE" THEN
  740. ''        RecalcPath
  741. ''        SetDriveStatus
  742. ''        GOTO OPT1L1
  743. ''    ELSEIF sz$ = "EXIT" THEN
  744. ''        GOSUB ASKQUIT
  745. ''        GOTO OPT1L1
  746. ''    ELSE
  747. ''        UIPop 1
  748. ''        newopt$ = ""
  749. ''        GOTO CUSTINST
  750. ''    END IF
  751.  
  752.  
  753.  
  754. ''OPTFILES2:
  755. ''    SetSymbolValue "RadioDefault", OPT2OPT$
  756. ''OPT2L1:
  757. ''    sz$ = UIStartDlg(CUIDLL$, OPTIONS, "FRadioDlgProc", APPHELP, HELPPROC$)
  758. ''    newopt$ = GetSymbolValue("ButtonChecked")
  759. ''
  760. ''    IF sz$ = "CONTINUE" THEN
  761. ''        UIPop 1
  762. ''        IF newopt$ <> OPT2OPT$ THEN
  763. ''            OPT2OPT$ = newopt$
  764. ''            RecalcOptFiles OPTFILES2
  765. ''            SetDriveStatus
  766. ''        END IF
  767. ''        newopt$ = ""
  768. ''        GOTO CUSTINST
  769. ''    ELSEIF sz$ = "REACTIVATE" THEN
  770. ''        RecalcPath
  771. ''        SetDriveStatus
  772. ''        GOTO OPT2L1
  773. ''    ELSEIF sz$ = "EXIT" THEN
  774. ''        GOSUB ASKQUIT
  775. ''        GOTO OPT2L1
  776. ''    ELSE
  777. ''        UIPop 1
  778. ''        newopt$ = ""
  779. ''        GOTO CUSTINST
  780. ''    END IF
  781.  
  782. ASKUPDATE:
  783.      sz$ = UIStartDlg(CUIDLL$, ASKUPDATE, "FAskUpdateDlgProc", 0, "")
  784.     IF sz$ = "YES" THEN
  785.        CopyFile szOF$, GetWindowsSysDir() + "CTL3D.OLD", cmoOverwrite, 0
  786.        CopyFile szNF$, szOF$, cmoOverwrite, 0 
  787.     ENDIF
  788.         
  789.      UIPop 1
  790.      RETURN
  791.  
  792. TOOBIG:
  793.     sz$ = UIStartDlg(CUIDLL$, TOOBIG, "FInfo0DlgProc", 0, "")
  794.     IF sz$ = "REACTIVATE" THEN
  795.     RecalcPath
  796.     SetDriveStatus
  797.     GOTO TOOBIG
  798.     END IF
  799.     UIPop 1
  800.     RETURN
  801.  
  802.  
  803.  
  804. BADPATH:
  805.     sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfo0DlgProc", 0, "")
  806.     IF sz$ = "REACTIVATE" THEN
  807.     RecalcPath
  808.     SetDriveStatus
  809.     GOTO BADPATH
  810.     END IF
  811.     UIPop 1
  812.     RETURN
  813.  
  814.  
  815. ASKQUIT:
  816.     sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
  817.  
  818.     IF sz$ = "EXIT" THEN
  819.     UIPopAll
  820.     ERROR STFQUIT
  821.     ELSEIF sz$ = "REACTIVATE" THEN
  822.     GOTO ASKQUIT
  823.     ELSE
  824.     UIPop 1
  825.     END IF
  826.     RETURN
  827.  
  828.  
  829.  
  830. '**
  831. '** Purpose:
  832. '**     Adds the specified option files to the copy list.
  833. '** Arguments:
  834. '**     ftype%  - type of files to add, one of the following:
  835. '**             APPFILES, OPTFILES1, OPTFILES2
  836. '** Returns:
  837. '**     none.
  838. '*************************************************************************
  839. SUB AddOptFilesToCopyList (ftype%) STATIC
  840.  
  841.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  842.     IF ftype% = APPFILES THEN
  843.     AddSectionFilesToCopyList "EmulFiles", SrcDir$, DEST$
  844.     ELSEIF ftype% = OPTFILES1 AND GetListItem(CHECKSTATES$, OPTFILES1) = "ON" THEN
  845.     AddSectionFilesToCopyList "KernelFiles", SrcDir$, DEST$
  846.     ELSEIF ftype% = OPTFILES2  THEN
  847.     AddSectionFilesToCopyList "KernelnFiles", SrcDir$, DEST$
  848.     ELSEIF ftype% = CRYPTFILES  THEN
  849.     AddSectionFilesToCopyList "CryptFiles", SrcDir$, DEST$
  850.     ELSEIF ftype% = CTL3DFILES  THEN
  851.     AddSectionFilesToCopyList "Ctl3dFiles", SrcDir$, DEST$
  852.     ELSEIF ftype% = CONVERTFILES  THEN
  853.     AddSectionFilesToCopyList "ConvertFiles", SrcDir$, DEST$
  854.     ENDIF
  855.     SrcDir$ = ""
  856.  
  857. END SUB
  858.  
  859.  
  860. '**
  861. '** Purpose:
  862. '**     Recalculates disk space for the given option files and sets
  863. '**     the status info symbol "StatusItemsText".
  864. '** Arguments:
  865. '**     ftype% - type of files to add, one of the following:
  866. '**             APPFILES, OPTFILES1, OPTFILES2
  867. '** Returns:
  868. '**     none.
  869. '*************************************************************************
  870. SUB RecalcOptFiles (ftype%) STATIC
  871.     CursorSave% = ShowWaitCursor()
  872.     ClearCopyList
  873.     AddOptFilesToCopyList ftype%
  874.  
  875.     fExtra% = 0
  876.     IF ftype% = APPFILES THEN
  877.     ListSym$ = APPNEEDS$
  878. ''        IF GetListItem(CHECKSTATES$, APPFILES) = "ON" THEN
  879.         ''Add extra cost to Windows drive for ini/progman, etc.
  880.         ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
  881.         ReplaceListItem EXTRACOSTS$, ndrive%, "10240"
  882.         fExtra% = 1
  883. ''        END IF
  884.     ELSEIF ftype% = OPTFILES1 THEN
  885.     ListSym$ = OPT1NEEDS$
  886.     ELSEIF ftype% = OPTFILES2 THEN
  887.     ListSym$ = OPT2NEEDS$
  888.     END IF
  889.  
  890.     StillNeed& = GetCopyListCost(EXTRACOSTS$, ListSym$, "")
  891.  
  892.     cost& = 0
  893.     FOR i% = 1 TO 26 STEP 1
  894.     cost&  = cost& + VAL(GetListItem(ListSym$, i%))
  895.     NEXT i%
  896.     ReplaceListItem STATUSTEXT$, ftype%, STR$(cost& / 1024) + " K"
  897.  
  898.     IF StillNeed& > 0 THEN
  899.     ReplaceListItem BIGLIST$, ftype%, "YES"
  900.     ELSE
  901.     ReplaceListItem BIGLIST$, ftype%, ""
  902.     END IF
  903.  
  904.     IF fExtra% THEN
  905.     ReplaceListItem EXTRACOSTS$, ndrive%, "0"
  906.     END IF
  907.     RestoreCursor CursorSave%
  908.     ListSym$ = ""
  909. END SUB
  910.  
  911.  
  912. '**
  913. '** Purpose:
  914. '**     Recalculates disk space and sets option status info according
  915. '**     to the current destination path.
  916. '** Arguments:
  917. '**     none.
  918. '** Returns:
  919. '**     none.
  920. '*************************************************************************
  921. SUB RecalcPath STATIC
  922.  
  923.     CursorSave% = ShowWaitCursor()
  924.  
  925.     DESTKER$= MakePath( DEST$, "KERNELW")
  926.     FILEPATH$= MakePath( DESTKER$, "TUNTCPIP.DLL")
  927.     IF DoesFileExist ( FILEPATH$, femExits) = 1 THEN
  928.       MasterFileVersion$ = GetSectionKeyVersion("KernelFiles","TUNTCPIP.DLL")
  929.       DiskFileVersion$ = GetVersionOfFile( FILEPATH$)
  930.       INSTALLEDKER% = IsNewer( DiskFileVersion$, MasterFileVersion$) 
  931.     ENDIF
  932.     RecalcOptFiles APPFILES
  933.     IF INSTALLEDKER% <> 1 THEN
  934.       ReplaceListItem CHECKSTATES$, OPTFILES1, "ON"
  935.     ELSE
  936.       ReplaceListItem CHECKSTATES$, OPTFILES1, "OFF"
  937.     ENDIF
  938.     RecalcOptFiles OPTFILES1
  939.     IF INSTALLEDKER% <> 1 THEN
  940.       RecalcOptFiles OPTFILES2
  941.     ENDIF
  942.  
  943.     RestoreCursor CursorSave%
  944. END SUB
  945.  
  946.  
  947. '**
  948. '** Purpose:
  949. '**     Sets drive status info according to latest disk space calcs.
  950. '** Arguments:
  951. '**     none.
  952. '** Returns:
  953. '**     none.
  954. '*************************************************************************
  955. SUB SetDriveStatus STATIC
  956.  
  957.     drive$ = MID$(DEST$, 1, 1)
  958.     ndrive% = ASC(ucase$(drive$)) - ASC("A") + 1
  959.     cost& = VAL(GetListItem(APPNEEDS$, ndrive%)) +VAL(GetListItem(OPT1NEEDS$, ndrive%)) +VAL(GetListItem(OPT2NEEDS$, ndrive%))
  960.     free& = GetFreeSpaceForDrive(drive$)
  961.     ReplaceListItem DRIVETEXT$, 1, drive$ + ":"
  962.     ReplaceListItem DRIVETEXT$, 2, STR$(cost& / 1024) + " K"
  963.     ReplaceListItem DRIVETEXT$, 3, STR$(free& / 1024) + " K"
  964.  
  965.     IF drive$ = WINDRIVE$ THEN
  966. ''      ReplaceListItem DRIVETEXT$, 4, ""
  967.     ReplaceListItem DRIVETEXT$, 5, ""
  968.     ReplaceListItem DRIVETEXT$, 6, ""
  969.     ELSE
  970.     ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
  971.     cost& = VAL(GetListItem(APPNEEDS$, ndrive%))
  972.     IF cost& = 0 THEN
  973. ''          ReplaceListItem DRIVETEXT$, 4, ""
  974.         ReplaceListItem DRIVETEXT$, 5, ""
  975.         ReplaceListItem DRIVETEXT$, 6, ""
  976.     ELSE
  977.         free& = GetFreeSpaceForDrive(WINDRIVE$)
  978. ''          ReplaceListItem DRIVETEXT$, 4, WINDRIVE$ + ":"
  979.         ReplaceListItem DRIVETEXT$, 5, STR$(cost& / 1024) + " K"
  980.         ReplaceListItem DRIVETEXT$, 6, STR$(free& / 1024) + " K"
  981.     END IF
  982.     END IF
  983. END SUB
  984.  
  985.  
  986. '**
  987. '** Purpose:
  988. '**     Appends a file name to the end of a directory path,
  989. '**     inserting a backslash character as needed.
  990. '** Arguments:
  991. '**     szDir$  - full directory path (with optional ending "\")
  992. '**     szFile$ - filename to append to directory
  993. '** Returns:
  994. '**     Resulting fully qualified path name.
  995. '*************************************************************************
  996. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  997.     IF szDir$ = "" THEN
  998.     MakePath = szFile$
  999.     ELSEIF szFile$ = "" THEN
  1000.     MakePath = szDir$
  1001.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  1002.     MakePath = szDir$ + szFile$
  1003.     ELSE
  1004.     MakePath = szDir$ + "\" + szFile$
  1005.     END IF
  1006. END FUNCTION
  1007.  
  1008. FUNCTION MakeString (i%) STATIC AS STRING
  1009.  
  1010.     Number$ = "0123456789"
  1011.     MakeString = "0" + MID$(Number$,i%+1 ,1)
  1012.     
  1013. END FUNCTION
  1014.  
  1015. '**
  1016. '** Purpose:
  1017. '**     Newest version 
  1018. '** Arguments:
  1019. '**     szVersion1$ - N.N.N.N version string 1 
  1020. '**     szVersion2$ - N.N.N.N version string 2 
  1021. '** Returns:
  1022. '**     If szVersion1$ > szVersion2$  return 0 
  1023. '**     If szVersion1$ = szVersion2$  return 1 
  1024. '**     If szVersion1$ < szVersion2$  return 2 
  1025. '*************************************************************************
  1026. FUNCTION IsNewer (szVersion1$, szVersion2$) STATIC AS INTEGER
  1027.     IF GetVersionNthField(szVersion1$,1) < GetVersionNthField(szVersion2$,1) THEN
  1028.     IsNewer = 2
  1029.     ELSEIF GetVersionNthField(szVersion1$,1) > GetVersionNthField(szVersion2$,1) THEN
  1030.     IsNewer = 0
  1031.     ELSE 
  1032.     IF GetVersionNthField(szVersion1$,2) < GetVersionNthField(szVersion2$,2) THEN
  1033.       IsNewer = 2
  1034.     ELSEIF GetVersionNthField(szVersion1$,2) > GetVersionNthField(szVersion2$,2) THEN
  1035.     IsNewer = 0
  1036.     ELSE
  1037.       IF GetVersionNthField(szVersion1$,3) < GetVersionNthField(szVersion2$,3) THEN
  1038.         IsNewer = 2
  1039.       ELSEIF GetVersionNthField(szVersion1$,3) > GetVersionNthField(szVersion2$,3) THEN
  1040.         IsNewer = 0
  1041.       ELSE
  1042.         IF GetVersionNthField(szVersion1$,4) < GetVersionNthField(szVersion2$,4) THEN
  1043.           IsNewer = 2
  1044.         ELSEIF GetVersionNthField(szVersion1$,4) > GetVersionNthField(szVersion2$,4) THEN
  1045.           IsNewer = 0
  1046.         ELSE
  1047.           IsNewer = 1
  1048.         END IF
  1049.       END IF
  1050.     END IF
  1051.     END IF
  1052. END FUNCTION
  1053.  
  1054. FUNCTION IsInstalled(szSection$,szKey$,szFile$,szPath$) STATIC AS INTEGER 
  1055.  
  1056.     IsInstalled = 4
  1057.     FILEPATH$= MakePath( szPath$, szFile$)
  1058.     IF DoesFileExist ( FILEPATH$, femExists) = 1 THEN
  1059.       MasterFileVersion$ = GetSectionKeyVersion(szSection$,szKey$)
  1060.       DiskFileVersion$ = GetVersionOfFile( FILEPATH$)
  1061.       IsInstalled = IsNewer( DiskFileVersion$, MasterFileVersion$) 
  1062.     ENDIF
  1063.  
  1064. END FUNCTION
  1065.